#include<iostream>
#include<cstring>
using namespace std;

/*
构造函数
*1.功能：创建对象时，为对象分配存储空间，同时为对象的数据成员进行初始化。
*2.写法：
   a.没有返回类型，且不写void；
   b.函数名与类名相同。
*3.调用时机：当创建/定义对象时，系统会自动调用构造函数，即系统提供的默认的构造函数无效。
 4.初始化列表（冒号后 大括号前的内容）。
 5.类内声明，类外实现。
   e.g
      在类内：
      stu(char* n, int a) //声明
      在类外：
	  stu::stu(char* n, int a) //实现
	  {
	      strcpy(name, n);
	      age = a;
	  }
*6.默认构造：如果没有自定义构造函数，系统会提供一个默认的构造函数。
   e.g       stu s1; ---> stu s1(){} --->（系统提供的默认构造函数）
             如果已经自定义构造函数，系统提供的默认的构造函数无效。
 7.带默认值的构造函数
   e.g ①.stu(char* n, int a = 0)
   		 创建对象时：stu s2("李四")；
       ②.stu(char* n = "", int a = 0)
	 	 创建对象时：stu s3; ---> 不传参的时候不用加括号！！！
*8.构造函数重载
   重载：函数名相同，参数不同的函数。
   e.g 
    ①.stu(char* n, int a) ---> stu s1("张三", 18);
       {
	 	  strcpy(name, n);
	       age = a;
	   }
    ②.stu(int b) ---> stu s2(18);
 	   {
 	       age = b;
  	   }
    ③.stu(char* m) ---> stu s3("李四");
   	   {
	   	   strcpy(name, m);
	   }
    ④.stu(){} ---> stu s4;
 9.无名对象（尽管没有名字，但是也会自动调构造）
   e.g stu ("张三", 20);
*/

/*class stu
{
    char name[20];
	int age;
public:
	//构造函数的第一种写法：
	stu(char* n, int a)
	{
		strcpy(name, n);
		age = a;
	}
	//构造函数的第二种写法：
	//stu(char* n, int a):age(a)//4.初始化列表(冒号后的部分)
	//{
	//	strcpy(name, n);
	//}
	void show()
	{
		cout<<"姓名："<<name<<"  "<<"年龄："<<age<<endl;
	}
};

int main()
{
	stu s1("张三", 20);//等价于 int a = 3(定义+初始化)
	s1.show();
	return 0;
}*/

//未使用构造函数的写法：
/*
class stu
{
	char name[20];
	int age;
public:
	void input(char* n, int a)
	{
		strcpy(name, n);
		age = a;
	}
	void show()
	{
		cout<<"姓名："<<name<<"  "<<"年龄："<<age<<endl;
	}
}

int main()
{
	stu s1;
	s1.input("张三", 18);
	s1.show();
	return 0;
}
*/

/*复制构造函数/拷贝
1.功能：用一个已经定义的对象(1)对一个新对象(2)进行初始化(1和2的信息相同，可以将1的信息直接复制给2)。
2.写法：参数是对象的引用。
3.默认复制构造：系统存在默认的复制构造函数，当存在自定义的复制构造函数时，系统的复制构造函数不执行。
4.应用：
    a.用一个已经定义的对象(1)对一个新对象(2)进行初始化；
    b.对象做函数参数；
	c.返回值是对象。
*/

/*
class stu
{
	char name[20];
	int age;
public:
	stu(char* n, int a)
	{
		strcpy(name, n);
		age = a;
	}
	stu(stu &s)//复制构造函数  //参数是对象的引用
	{
		strcpy(name, s.name);
		age = s.age;
		cout<<"复制构造函数"<<endl;
	}
	void show()
	{
		cout<<name<<"  "<<age<<endl;
	}
};

void fun(stu st)
{
	st.show();	
}
int main()
{
	stu s1("张三", 20);
	//s1.show();
	fun(s1);
	
	stu s2(s1);
	s2.show();
	
	return 0;
}*/
